#!/usr/bin/python
# -*- coding: utf-8 -*-

from DocumentoLatex import DocumentoLatex
from BeautifulSoup import BeautifulSoup
from BeautifulSoup import NavigableString
from EstiloCSS import EstiloCSS
import pdb
import os
import sys

class HTMLParser:
    def __init__(self, archivo_html, archivo_css):
        self.archivo_html = archivo_html
        self.archivo_css = archivo_css
        self.documento_latex = DocumentoLatex()
        self.html_parseado = []
        self.estilos_css = []

    def crear_sopa(self):
        try:
            html_open = open(self.archivo_html, "r")
        except IOError:
            print "El archivo no existe"
            sys.exit(1)
        else:
            html_read = html_open.read()
            html_open.close()
            self.soup = BeautifulSoup(html_read)

    def buscar_siguiente(self):
        path = "/home/manuel/cookbook/0596007973/"
        self.archivo_html = path + self.soup.findAll(dict(a=True))[2].get("href")
        #self.crear_sopa()
        #self.parser()

    def parser(self):
        etiquetas = dict(p=True, h1=True, h2=True, h3=True,
                         h4=True, h5=True, h6=True, pre=True)
        vineta = False
        # buscamos todas las etiquetas que nos interesan
        for etiqueta in self.soup.findAll(etiquetas):
            # recorremos TODAS las etiquetas que tenga dentro (hijos) la
            # etiqueta actual
            #pdb.set_trace()
            #print etiqueta
            for hijo in etiqueta.recursiveChildGenerator():
                # verificamos que no sea una cadena
                if type(hijo) == NavigableString:
                    continue
                # reemplazamos por negrita
                if hijo.name in ["a", "tt"]:
                    if hijo.string != None:
                        aux = hijo.string.replace("\r\n", "").replace("\\", "\\\\")
                        hijo.replaceWith("\\textbf{%s} " % aux)
                    else:
                        hijo.replaceWith("")
                # reemplazamos por cursiva
                elif hijo.name in ["span", "i"]:
                    if hijo.string != None:
                        aux = hijo.string.replace("\r\n", "").replace("\\", "\\\\")
                        hijo.replaceWith("\\textit{%s} " % aux)
                    else:
                        hijo.replaceWith("")
                elif hijo.name in ["sub", "sup"]:
                    if hijo.string != None:
                        aux = hijo.string.replace("\r\n", "").replace("\\", "\\\\")
                        hijo.replaceWith("%s " % aux)
                    else:
                        hijo.replaceWith("")
                elif hijo.name in ["b"]:
                    if hijo.string != None:
                        aux = hijo.string.replace("\r\n", "")
                        hijo.replaceWith("%s " % aux)
                    else:
                        hijo.replaceWith("")
            estilo = None
            if etiqueta.has_key("class"):
                estilo = etiqueta.get("class")
                if estilo == "docList" and not vineta:
                    self.documento_latex.abrir_vineta()
                    vineta = True
                elif estilo != "docList" and vineta:
                    self.documento_latex.cerrar_vineta()
                    vineta = False
            # habia p que no tenian clases y su contenido era vacio
            # por lo que los descartamos y continuamos
            elif etiqueta.name in ["p"]:
                continue
            elif etiqueta.name in ["pre"]:
                estilo = "pre"
            #pdb.set_trace()
            try:
                texto = ''.join(etiqueta.contents)
            except TypeError:
                print etiqueta.contents
            estilo = EstiloCSS(texto, estilo)
            self.documento_latex.escribir(estilo)
        if vineta:
            self.documento_latex.cerrar_vineta()

    def finalizar(self):
        self.documento_latex.finalizar()

    def procesar_texto(self):
        self.documento_latex.procesar_texto()